package utils

import (
	"fmt"
	"math"
	"math/big"
)

// HasPoint 检查 num 是否有小数
//
// 如 hasPoint(1.2) -> true
func HasPoint[T float32 | float64](num T) bool {
	return float64(num) != math.Trunc(float64(num))
}

// PrettyFloat2 对 num 进行格式化
//
// 若 num 无小数，展示 num 的字符串
// 若 num 有小数，展示 num 的两位小数格式字符串
// 若 num 有小数且小数位较多，则四舍五入展示两位小数格式字符串
func PrettyFloat2[T float32 | float64](num T) string {
	if HasPoint[T](num) {
		return fmt.Sprintf("%.2f", num)
	}
	return fmt.Sprintf("%.0f", num)
}

/*	小数点右移 shiftAmount 位不丢失精度 */
func ShiftRight(data string, shiftAmount int, prec int) string {

	decimal := new(big.Rat)
	decimal.SetString(data)

	numerator := new(big.Int).Mul(decimal.Num(), new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(shiftAmount)), nil))
	result := new(big.Rat).SetFrac(numerator, decimal.Denom())

	return result.FloatString(prec)
}

/*	小数点左移 shiftAmount 位不丢失精度 */
func ShiftLeft(data string, shiftAmount int, prec int) string {

	integer := new(big.Int)
	integer.SetString(data, 10)

	denominator := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(shiftAmount)), nil)
	result := new(big.Rat).SetFrac(integer, denominator)

	return result.FloatString(prec)
}
